package com.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Hibernate;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.springframework.dao.DataAccessException;

import com.model.Tarifario;
import com.query.TarifarioQuery;

public class TarifarioDAOImpl extends
		BaseHibernateDAO<Tarifario, TarifarioQuery> {

	@Override
	public Class<Tarifario> getModelClass() {
		return Tarifario.class;
	}

	@Override
	public List<String> getListNames() {
		List<String> lista = new ArrayList<String>();
		lista.add("listaProductoPrecio");
		return lista;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Tarifario> getList(Object queryObject)
			throws DataAccessException {

		TarifarioQuery query = (TarifarioQuery) queryObject;

		DetachedCriteria criteria = DetachedCriteria.forClass(Tarifario.class);

		if (query.getTipoTarifario() != null) {
			criteria.add(Restrictions.eq("tipoTarifario",
					query.getTipoTarifario()));
		}

		if (query.getFuturo() != null && query.getFuturo()) {
			criteria.add(Restrictions.or(Restrictions.and(
					Restrictions.le("fechaDesde", query.getFecha()),
					Restrictions.ge("fechaHasta", query.getFecha())),
					Restrictions.ge("fechaDesde", query.getFecha())));
		} else {
			criteria.add(Restrictions.and(
					Restrictions.le("fechaDesde", query.getFecha()),
					Restrictions.ge("fechaHasta", query.getFecha())));
		}

		if (query.getProveedorID() != null) {
			criteria.add(Restrictions.eq("proveedor.id", query.getProveedorID()));
		}

		List<Tarifario> list = (List<Tarifario>) getHibernateTemplate()
				.findByCriteria(criteria);
		return list;
	}

	@Override
	public Tarifario findBy(Long id) throws DataAccessException {
		DetachedCriteria criteria = DetachedCriteria.forClass(Tarifario.class);
		criteria.add(Restrictions.eq("proveedor.id", id));
		Tarifario object = (Tarifario) getHibernateTemplate().findByCriteria(
				criteria).get(0);
		Hibernate.initialize(object.getListaProductoPrecio());
		return object;
	}

}
